#include <algorithm/analytical_model/io/json/converter/analytical_model/ScenePara.h>
#include <utils/HasValue.h>

using namespace solar;

void solar::tag_invoke(const boost::json::value_from_tag& /*unused*/,
                       boost::json::value& json_value, const ScenePara& scene_para)
{
    const auto DNI = SOLAR_GET_VALUE(ScenePara, DNI_, scene_para);
    const auto CSR = SOLAR_GET_VALUE(ScenePara, CSR_, scene_para);
    json_value = {
        {"DNI", DNI},
        {"CSR", CSR}
    };
}

auto solar::tag_invoke(const boost::json::value_to_tag<ScenePara>& /*unused*/,
                       const boost::json::value& json_value) -> ScenePara
{
    const auto* value_ptr = json_value.if_object();
    if (value_ptr == nullptr)
    {
        return {};
    }
    ScenePara result;
    if (const auto* dni_value = value_ptr->if_contains("DNI"); dni_value != nullptr)
    {
        SOLAR_SET_VALUE(ScenePara, DNI_, dni_value->to_number<double>(), result)
    }
    if (const auto* csr_value = value_ptr->if_contains("CSR"); csr_value != nullptr)
    {
        SOLAR_SET_VALUE(ScenePara, CSR_, csr_value->to_number<double>(), result)
    }
    return result;
}
